//
// Created by Jisam on 28/09/2024 12:17 AM.
// Solution of  搬家
#include <bits/stdc++.h>

using namespace std;
using i64 = long long;
using u64 = unsigned long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        // 定义三个长整型变量，分别代表物品数量n，收纳箱数量m，以及每个收纳箱的容量k
        i64 n, m, k;
        // 从标准输入读取物品数量n，收纳箱数量m，以及每个收纳箱的容量k
        cin >> n >> m >> k;

        // 初始化一个大小为n+1的长整型向量a，用于存储每个物品的体积
        vector<i64> a(n + 1);
        // 读取每个物品的体积并存入向量a中
        for (int i = 1; i <= n; i++) cin >> a[i];

        // 初始化sum为0，用于计算当前收纳箱已装物品的总体积
        i64 sum = 0;
        // 初始化logn为log2(n)的整数部分，用于快速查找
        i64 logn = 31 - __builtin_clz(n);

        // 初始化二维向量nxt，用于记录每个位置经过若干次跳跃后到达的位置
        vector<vector<i64>> nxt(logn + 5, vector<i64>(n + 2));

        // 初始化两个指针l和r，分别指向当前处理的物品和下一个可能装入收纳箱的物品
        i64 l = 1, r = 1;

        // 计算每个位置的跳跃表
        while (l <= r && l <= n) {
            // 当r超出物品范围时，记录当前位置的跳跃位置，并更新sum和l
            if (r == n + 1) {
                nxt[0][l] = r;
                sum -= a[l];
                l++;
                continue;
            }
            // 尝试将物品r装入收纳箱
            sum += a[r];
            // 如果超过了收纳箱容量，更新跳跃表并调整sum和l
            while (sum > k) {
                nxt[0][l] = r;
                sum -= a[l];
                l++;
            }
            // 移动到下一个物品
            r++;
        }

        // 处理最后一个物品的情况
        nxt[0][n + 1] = n + 1;

        // 构建跳跃表的其他层
        for (int i = 1; i <= logn; i++) {
            for (int j = 1; j <= n + 1; j++) {
                nxt[i][j] = nxt[i - 1][nxt[i - 1][j]];
            }
        }

        // 初始化答案变量ans为-1
        i64 ans = -1;

        // 遍历所有可能的起始位置i
        for (int i = 1; i <= n; i++) {
            // 初始化当前剩余的收纳箱数量num为m，临时结果tmp为0，当前处理的物品位置l为i
            i64 num = m, tmp = 0, l = i;
            // 使用跳跃表快速计算最多能装入多少物品
            for (i64 j = logn; j >= 0; j--) {
                if (num >= (1 << j)) {
                    num -= (1 << j);
                    tmp += nxt[j][l] - l;
                    l = nxt[j][l];
                    if (l == n + 1) break;
                }
            }
            // 更新最大值
            ans = max(ans, tmp);
        }

        // 输出最多能装入的物品数量
        cout << ans << "\n";

    }

    return 0;
}